package entity

import (
	"errors"
	"fmt"
	"time"

	"shqsoft.cn/pasnj/base"
	"shqsoft.cn/pasnj/workflow"
	"shqsoft.cn/pasnj/workflow/entity"

	"github.com/jinzhu/gorm"
)

//IndiClieDiviFlow2AppBak 零售客户认定审批变更
type IndiClieDiviFlow2AppBak struct {
	ID         int       `gorm:"AUTO_INCREMENT;primary_key;column:ID"`
	IDNO       string    `gorm:"column:IDNO"`
	CUNM       string    `gorm:"column:CUNM"`
	UTNM       string    `gorm:"column:UTNM;"`
	CUID       int       `gorm:"column:CUID"`
	UTID       int       `gorm:"column:UTID"`
	ACNO       string    `gorm:"column:ACNO"`
	BANO       string    `gorm:"column:BANO"`
	ACID       int       `gorm:"column:ACID"`
	OPDT       time.Time `gorm:"column:OPDT"`
	ITNM       string    `gorm:"column:ITNM"`
	ACBL       float64   `gorm:"column:ACBL"`
	EMNO1      string    `gorm:"column:EMNO1"`
	EMID1      int       `gorm:"column:EMID1"`
	EMNM1      string    `gorm:"-" json:"emnm1"`
	DSVL1      float64   `gorm:"column:DSVL1"`
	EMNO2      string    `gorm:"column:EMNO2"`
	EMNM2      string    `gorm:"-" json:"emnm2"`
	EMID2      int       `gorm:"column:EMID2"`
	DSVL2      float64   `gorm:"column:DSVL2"`
	EMNO3      string    `gorm:"column:EMNO3"`
	EMNM3      string    `gorm:"-" json:"emnm3"`
	EMID3      int       `gorm:"column:EMID3"`
	DSVL3      float64   `gorm:"column:DSVL3"`
	DSDT       time.Time `gorm:"column:DSDT"`
	UID        int       `gorm:"column:UID"`
	WFID       int       `gorm:"column:WFID"`
	FRID       int       `gorm:"column:FRID"`
	Progress   float64   `gorm:"-" json:"progress"`
	StepName   string    `gorm:"-" json:"stepName"`
	Status     string    `gorm:"-" json:"status"`
	STEP       int       `gorm:"-" json:"step"`
	THSM       string    `gorm:"column:THSM"`
	SQR        string    `gorm:"column:SQR"`
	SQR2       string    `gorm:"column:SQR2"`
	SQR3       string    `gorm:"column:SQR3"`
	CREATETIME time.Time `gorm:"column:CREATETIME"`
	UPDATETIME time.Time `gorm:"column:UPDATETIME"`
}

//TableName User用户表名
func (IndiClieDiviFlow2AppBak) TableName() string {
	return "T_INDI_CLIE_DIVI2_BAK"
}

//BeforeSave 保存前的触发器
func (i *IndiClieDiviFlow2AppBak) BeforeSave(tx *gorm.DB) (err error) {
	row := tx.Raw("select JZDATE,BACKDATE from dbo.GetFlowDate()").Row()
	var jzDate time.Time
	var zsDate time.Time
	row.Scan(&jzDate, &zsDate)
	if i.DSDT.Unix() < zsDate.Unix() {
		err = fmt.Errorf("已过认定截止日%s，认定日期不能早于%s！", jzDate.Format("2006-01-02"), zsDate.Format("2006-01-02"))
		return
	}
	sqlstr := "select OPDT,CUNM,ID CUID,UTID,UTNM from V_INDI_CLIE_FLOW WHERE IDNO=?"
	row = tx.Raw(sqlstr, i.IDNO).Row()
	row.Scan(&i.OPDT, &i.CUNM, &i.CUID, &i.UTID, &i.UTNM)
	if i.CUID == 0 {
		return errors.New("证件号码%s在系统中不存在！")
	}
	if i.DSVL1 == 0 {
		return errors.New("员工号1占比不能为0！")
	}
	sum := i.DSVL1 + i.DSVL2 + i.DSVL3
	if sum != 100 {
		return errors.New("占比之和必须为100！")
	}
	var emid1, emid2, emid3 int
	sql := "select ID,SysUserName from T_SysUser where SysUserID=?"
	row = tx.Raw(sql, i.EMNO1).Row()
	row.Scan(&emid1, &i.SQR)
	if emid1 == 0 {
		return fmt.Errorf("员工号1:%s在系统中没有找到！", i.EMNO1)
	}
	i.EMID1 = emid1
	if i.UID == 0 {
		i.UID = i.EMID1
	}
	sqlstrs := "select PDID from dim_user where emid=?"
	row = tx.Raw(sqlstrs, i.UID).Row()
	var utid int
	row.Scan(&utid)
	if utid != 61 {
		if i.UID != i.EMID1 {
			return fmt.Errorf("员工号1:%s必须和申请人一致！", i.EMNO1)
		}
	}
	if i.DSVL2 > 0 {
		row = tx.Raw(sql, i.EMNO2).Row()
		row.Scan(&emid2, &i.SQR2)
		if emid2 == 0 {
			return fmt.Errorf("员工号2:%s在系统中没有找到！", i.EMNO2)
		}
		i.EMID2 = emid2
	}
	if i.DSVL3 > 0 {
		row = tx.Raw(sql, i.EMNO3).Row()
		row.Scan(&emid3, &i.SQR3)
		if emid3 == 0 {
			return fmt.Errorf("员工号3:%s在系统中没有找到！", i.EMNO2)
		}
		i.EMID3 = emid3
	}
	sqlEx := "select ParentOrganID from V_ParentOrgan where OrganID=?"
	row = tx.Raw(sqlEx, i.UTID).Row()
	var utid2 int
	row.Scan(&utid2)
	var count int
	if utid2 != 61 {
		if utid == 61 {
			sql = "select count(a.ID) from t_indi_acco_divi a inner join t_indi_acco b on a.acid=b.id where a.iswo=0 and wodt is null and b.cuid=?"
			row = tx.Raw(sql, i.CUID).Row()
			row.Scan(&count)
			if count == 0 {
				return fmt.Errorf("客户:%s(%s)开户机构非无锡分行以及下辖支行开户，且没有认定，如果需要请使用申请零售新客户流程！", i.CUNM, i.IDNO)
			}
		} else {
			sql = "select count(a.ID) from t_indi_acco_divi a inner join t_indi_acco b on a.acid=b.id where a.iswo=0 and wodt is null and b.cuid=?"
			row = tx.Raw(sql, i.CUID).Row()
			row.Scan(&count)
			if count == 0 {
				return fmt.Errorf("客户:%s(%s)没有认定，如果需要请走申请零售新客户流程！", i.CUNM, i.IDNO)
			}

		}
	}
	if i.ID == 0 {
		sql = "select count(a.ID) from T_INDI_CLIE_DIVI2 a inner join T_FLOW_RUN b on a.FRID=b.ID where b.STATE=0 and a.CUID=?"
		row = tx.Raw(sql, i.CUID).Row()
		row.Scan(&count)
		if count > 0 {
			return fmt.Errorf("客户:%s(%s)已经在申请中，不能重复申请！", i.CUNM, i.IDNO)
		}
	}
	if i.ID > 0 {
		row := base.DB.Model(IndiClieDiviFlow2AppBak{}).Where("ID=?", i.ID).Select("FRID").Row()
		row.Scan(&i.FRID)
	}
	if i.FRID == 0 {
		sqlEx := "select PDID from dim_user where emid=?"
		row = tx.Raw(sqlEx, i.UID).Row()
		var utid int
		row.Scan(&utid)
		wfid := 2
		var utnm string
		if utid2 == 61 {
			wfid = 12
			utnm = "无锡分行"
		} else if utid2 == 80 {
			wfid = 22
			utnm = "南通分行"
		}
		if (utid2 == 61 || utid2 == 80) && (utid != utid2) {
			return fmt.Errorf("客户:%s(%s)在%s开户，请联系%s员工申请！", i.CUNM, i.IDNO, utnm, utnm)
		}
		runid, err := workflow.Create(wfid, i.UID, tx)
		if err != nil {
			return err
		}
		i.FRID = runid
	}
	i.CREATETIME = time.Now()
	i.UPDATETIME = time.Now()
	return
}

func (i *IndiClieDiviFlow2AppBak) AfterDelete(tx *gorm.DB) (err error) {
	if i.FRID > 0 {
		return workflow.Delete(i.FRID)
	}
	return nil
}

// AfterFind 查询后触发器
func (i *IndiClieDiviFlow2AppBak) AfterFind(tx *gorm.DB) (err error) {
	sqlEx := "select SysUserName from T_SysUser where ID = ?"
	row := tx.Raw(sqlEx, i.EMID1).Row()
	row.Scan(&i.EMNM1)
	if i.DSVL2 > 0 {
		row := tx.Raw(sqlEx, i.EMID2).Row()
		row.Scan(&i.EMNM2)
	}
	if i.DSVL3 > 0 {
		row := tx.Raw(sqlEx, i.EMID3).Row()
		row.Scan(&i.EMNM3)
	}
	if i.FRID == 0 {
		i.Status = "exception"
		i.StepName = "校验错误"
		return
	}
	run := entity.FlowRunBak{}
	if err = tx.Find(&run, i.FRID).Error; err != nil {
		tx.Rollback()
		return
	}
	wf := workflow.GetWorkFlow(run.WFID)
	if wf == nil {
		return fmt.Errorf("指定的流程ID:%d在流程配置中不存在！", run.WFID)
	}
	act := wf.GetAction(run.Step)
	if act == nil {
		return fmt.Errorf("指定的stepID:%d在流程%s配置中不存在！", run.Step, wf.Name)
	}
	count := len(wf.Actions)
	i.STEP = run.Step
	i.StepName = "审批中"
	if i.STEP == 1 {
		i.StepName = "申请中"
	}
	i.Progress = float64(act.Step*100) / float64(count)
	if i.Progress >= 100 && run.State == "0" {
		i.Progress = 95
	}
	i.Status = ""
	if run.State == "0" {
		i.Status = "active"
	} else if run.State == "2" {
		i.StepName = "已中止"
		i.Status = "exception"
	} else {
		i.StepName = "已完成"
		i.Status = "success"
	}
	i.CREATETIME = time.Now()
	i.UPDATETIME = time.Now()

	return
}

func IndiClieDiviFlow2AppBakEF() base.EntityFunc {
	return func() interface{} {
		entity := IndiClieDiviFlow2AppBak{}
		return &entity
	}
}
func IndiClieDiviFlow2AppBakESF() base.EntitiesFunc {
	return func() interface{} {
		var entities []IndiClieDiviFlow2AppBak
		return &entities
	}
}

func init() {
	dao := base.NewDefaultDao(IndiClieDiviFlow2AppBakEF(), IndiClieDiviFlow2AppBakESF(), nil)
	filter := base.WorkFolowFilter{
		FilterColName: "FRID",
	}
	filter.SetAdditional("wfid", "2,12,22")

	dao.Fileter = &filter
	base.DaoPoolObj.Put("IndiClieDiviFlow2AppBak", dao)
}
